1047. Student List for Course

Direct Link

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <iomanip>
#include <vector>
#include <deque>
#include <list>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <bitset>
#include <string>
#include <numeric>
#include <functional>
#include <iterator>
#include <typeinfo>
#include <utility>
#include <memory>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <cstddef>
#include <complex>
#include <ctime>
#include <cassert>
using namespace std;


static inline bool get(int &v)//fast to read huge input
{
    int s = 1, c;
    while(!isdigit(c = getchar())&&c != '-')
    {
        if(c == EOF)
            break ;
    }
    if(c == EOF) return 0;
    if(c == '-') s = 0 , v = 0;
    else v = c^48;
    for(;isdigit(c = getchar());v = (v << 1) + (v << 3) + (c ^ 48));
    v = (s ? v : -v);
    return 1 ;
}

struct f
{
    char name[5];
    int len;
    int cour[20];
}e;

int cmp(const f &a, const f &b)
{
    return strcmp(a.name,b.name) < 0;
}

vector<f> elem;
char ccName[40001][5];
vector<int> res[40001];
int main()
{
    int n,m,i,j;
    get(n);get(m);
    for(i = 0; i < n; i++)
    {
        scanf("%s", e.name);
        get(e.len);
        for(j = 0; j < e.len; j++)
        {
            get(e.cour[j]);
        }
        elem.push_back(e);
    }

    sort(elem.begin(), elem.end(), cmp);

    for(i = 0; i < n; i++)
    {
        strcpy(ccName[i], elem[i].name);
        for(j = 0; j < elem[i].len; j++)
        {
            res[elem[i].cour[j]].push_back(i);
        }
    }

    for(i = 1; i <= m; i++)
    {
        printf("%d %d\n",i,res[i].size());
        for(j = 0; j < res[i].size(); j++)
        {
            printf("%s\n", ccName[res[i][j]]);
        }
    }
    return 0;
}